package com.wskj.library.dao.impl;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;

import com.wskj.util.Config;
import com.wskj.util.JDBCUtil;

/**
 * 公共的操作 数据的操作 
 *    创建连接 
 *    关闭连接 
 *    进行修改的操作   insert  update  delete 
 *    进行查询的操作  select 
 * @author Administrator
 *
 */
public class BaseDao {
	
	private  Connection conn;//公共的连接
	private  PreparedStatement stmt;//预编译的申明
	private ResultSet rs;//结果集 ....
	
	/**
	 * 公共的开启连接的方法 ......
	 * @return
	 */
	protected  Connection  getConnection() {
		//Config config = Config.instance();
		try {
			/*Class.forName(config.getKey("driver"));
			String url=config.getKey("url");
			String user=config.getKey("user");
			String password=config.getKey("password");*/
			//conn = DriverManager.getConnection(url, user, password);
			
			Context ctx=new InitialContext();
			
			DataSource ds= (DataSource) ctx.lookup("java:comp/env/jdbc/library");
			
			conn=ds.getConnection();
			
		}catch (NamingException e) {			
			e.printStackTrace();
		} catch (SQLException e) {			
			e.printStackTrace();
		}		
		return conn;	
	}
	
	/**
	 * 公共的关闭连接的方法.... 
	 */
	protected  void  closeAll() {
		
		try {
			if(rs!=null)rs.close();
		} catch (SQLException e) {			
			e.printStackTrace();
		}
		
		try {
			if(stmt!=null)stmt.close();
		} catch (SQLException e) {			
			e.printStackTrace();
		}
		
		try {
			if(conn!=null)conn.close();
		} catch (SQLException e) {			
			e.printStackTrace();
		}
		
	}
	
	
	/**
	 * 公共的 修改的方法  ...
	 * @param sql 修改的sql 语句
	 * @param params 传递的参数  
	 * @return 影响的行数 
	 */
	public  int  executeUpdate(String sql,Object[] params) {
		int count=0;
		conn=getConnection();		
		try {
		   stmt=conn.prepareStatement(sql);
		   //? 赋值    ？从1  数组 从0 开始
		   if(params!=null) {			   
			   for(int i=0;i<params.length;i++) {				   
				   stmt.setObject(i+1, params[i]);
			   }	   
		   }		   
		   count=stmt.executeUpdate();   
		   //关闭连接 ....
		   closeAll();
		} catch (SQLException e) {			
			e.printStackTrace();
		}	
		return count;	
	}
	
	/**
	 * 公共的查询的方法  
	 * @param sql  查询的语句 sql 
	 * @param params 查询的参数 ...
	 * @return 查询的结果集 ...
	 */
	public  ResultSet  executeQuery(String sql,Object[] params) {
          conn=getConnection();		
		try {
		   stmt=conn.prepareStatement(sql);
		   //? 赋值    ？从1  数组 从0 开始
		   if(params!=null) {			   
			   for(int i=0;i<params.length;i++) {				   
				   stmt.setObject(i+1, params[i]);
			   }	   
		   }
		   //执行查询的操作 .....
		   rs=stmt.executeQuery();		   
		} catch (SQLException e) {			
			e.printStackTrace();
		}		
		return rs;		
	}
	
	/**
	 * 
	 * @param sql 查询语句 
	 * @param params 参数列表 
	 * @param cls 实体的类型   类的名称.class
	 * @return
	 */
	public <T>  List<T>   queryAll(String sql,Object[] params,Class<T> cls){
		 rs=executeQuery(sql, params);		 
		 List<T> list= JDBCUtil.convertResultSetToList(cls, rs);
		 //关闭 连接 。。。。
		closeAll();		 
		return  list;
	}
		
	/**
	 * 
	 * @param sql 查询的语句 
	 * @param params  参数列表
	 * @param cls 实体的类型  
	 * @return 返回单个的实体 ....
	 */
	public  <T>  T   queryOne(String sql,Object[] params,Class<T> cls){		
		 rs=executeQuery(sql, params);		 
		 T t= JDBCUtil.convertResultSetToEntity(cls, rs);
		 //关闭 连接 。。。。
		 closeAll();		 
		 return  t;
	}
	
	
	/**
	 * 分页中 获取  满足条件的个数 的方法  
	 * @param sql  查询语句 
	 * @param params 参数列表 
	 * @return 
	 */
	public   long   getCounts(String sql,Object[] params) {
		long  count=0L; 
		rs=executeQuery(sql, params);	
		
		try {
			rs.next();
			count=rs.getLong(1);			
			closeAll();
		} catch (SQLException e) {			
			e.printStackTrace();
		}		
		return  count;		
	}

}
